from threading import Event, Thread
import logging
import datetime

"""
实现Timer，延时执行的线程，延迟计算add(x,y)。

思路：
1.Timer的构造函数中参数得有哪些？
2.如何实现start启动一个线程执行函数。
3.如何cancel取消待执行任务。
"""


# 定义log全局设置
logging.basicConfig(level=logging.INFO)


# 定义一个加法函数
def add(x, y):
    logging.info('add is {}'.format(x + y))


# 定义延迟执行类
class Timmer:
    def __init__(self, fn, interval, *args, **kwargs):
        """
        :param fn:  函数
        :param interval: 延迟时间
        :param args:
        :param kwargs:
        """
        self.args = args
        self.kwargs = kwargs
        self.fn = fn
        self.interval = interval
        # Event实例化
        self.event = Event()

    def start(self):
        Thread(target=self.__run).start()

    def cancel(self):
        self.event.set()

    def __run(self):
        start = datetime.datetime.now()
        logging.info("waitting")
        # 等待，超时返回False
        self.event.wait(self.interval)
        # 观察flag是否False
        if not self.event.is_set():
            self.fn(*self.args, **self.kwargs)
        stop = (datetime.datetime.now() - start).total_seconds()
        logging.info('finish is {}'.format(stop))


t = Timmer(add, 10, 4, 5)
t.start()